<?php
namespace app\controller;

use think\Controller;
use think\Db;

/**
 * 多数据库使用示例控制器
 */
class Database extends Controller
{
    /**
     * 使用默认数据库连接 (mysql)
     */
    public function useDefaultDb()
    {
        try {
            // 方式1: 直接使用Db类 (使用默认连接)
            $result1 = Db::name('device_info')->select();
            
            // 方式2: 明确指定使用默认连接
            $result2 = Db::connect('mysql')->name('device_info')->select();
            
            return json([
                'code' => 1,
                'msg' => '默认数据库查询成功',
                'data' => [
                    'method1_count' => count($result1),
                    'method2_count' => count($result2)
                ]
            ]);
        } catch (\Exception $e) {
            return json([
                'code' => 0,
                'msg' => '默认数据库查询失败: ' . $e->getMessage()
            ]);
        }
    }
    
    /**
     * 使用第二个数据库连接 (mysql2)
     */
    public function useSecondDb()
    {
        try {
            // 使用第二个数据库连接
            $result = Db::connect('mysql2')->name('users')->select();
            
            return json([
                'code' => 1,
                'msg' => '第二个数据库查询成功',
                'data' => [
                    'count' => count($result),
                    'records' => $result
                ]
            ]);
        } catch (\Exception $e) {
            return json([
                'code' => 0,
                'msg' => '第二个数据库查询失败: ' . $e->getMessage()
            ]);
        }
    }
    
    /**
     * 跨数据库操作示例
     */
    public function crossDbOperation()
    {
        try {
            // 从第一个数据库获取数据
            $devices = Db::connect('mysql')->name('device_info')->limit(5)->select();
            
            // 向第二个数据库插入数据
            $insertData = [];
            foreach ($devices as $device) {
                $insertData[] = [
                    'device_imei' => $device['imei'] ?? '',
                    'device_sn' => $device['sn'] ?? '',
                    'sync_time' => date('Y-m-d H:i:s'),
                ];
            }
            
            if (!empty($insertData)) {
                $result = Db::connect('mysql2')->name('device_sync')->insertAll($insertData);
            }
            
            return json([
                'code' => 1,
                'msg' => '跨数据库操作成功',
                'data' => [
                    'source_count' => count($devices),
                    'synced_count' => $result ?? 0
                ]
            ]);
        } catch (\Exception $e) {
            return json([
                'code' => 0,
                'msg' => '跨数据库操作失败: ' . $e->getMessage()
            ]);
        }
    }
    
    /**
     * 事务操作示例 (单数据库内)
     */
    public function transactionExample()
    {
        // 开启事务
        Db::connect('mysql')->startTrans();
        
        try {
            // 执行多个数据库操作
            Db::connect('mysql')->name('device_info')->insert([
                'imei' => 'test_' . time(),
                'sn' => 'sn_' . time(),
            ]);
            
            Db::connect('mysql')->name('device_log')->insert([
                'action' => 'test_insert',
                'create_time' => date('Y-m-d H:i:s'),
            ]);
            
            // 提交事务
            Db::connect('mysql')->commit();
            
            return json([
                'code' => 1,
                'msg' => '事务操作成功'
            ]);
        } catch (\Exception $e) {
            // 回滚事务
            Db::connect('mysql')->rollback();
            
            return json([
                'code' => 0,
                'msg' => '事务操作失败: ' . $e->getMessage()
            ]);
        }
    }
    
    /**
     * 测试数据库连接
     */
    public function testConnections()
    {
        $results = [];
        
        // 测试默认数据库连接
        try {
            Db::connect('mysql')->query("SELECT 1");
            $results['mysql'] = [
                'status' => 'success',
                'message' => '连接成功',
                'database' => Db::connect('mysql')->getConfig('database')
            ];
        } catch (\Exception $e) {
            $results['mysql'] = [
                'status' => 'error',
                'message' => $e->getMessage()
            ];
        }
        
        // 测试第二个数据库连接
        try {
            Db::connect('mysql2')->query("SELECT 1");
            $results['mysql2'] = [
                'status' => 'success',
                'message' => '连接成功',
                'database' => Db::connect('mysql2')->getConfig('database')
            ];
        } catch (\Exception $e) {
            $results['mysql2'] = [
                'status' => 'error',
                'message' => $e->getMessage()
            ];
        }
        
        return json([
            'code' => 1,
            'msg' => '数据库连接测试完成',
            'data' => $results
        ]);
    }
}
